package com.cskaoyan.javase._1extends._4hierarchy;

/**
 * 思考以下问题:
 *      1.在Java中,extends关键字表示继承父类,那么可以直接继承两个父类吗?
 *          显然是不行的,extends关键字后面只能继承一个父类
 *
 *      2.在Java中,一个类只能有一个直接父类,那么它只能有一个父类吗?
 *          不是的,一个类可能有很多间接父类
 *          比如A继承B，B又继承了C，那么A的直接父类就是B，间接父类是C。
 *
 * 祖先类指的是继承层次中，处在最顶层的类。
 * 在Java当中，处在所有类继承层次的最顶层祖先类是——Object类。
 * 在Java中定义一个类，如果没有直接通过语法写出继承了Xxx类，那么它的直接父类就是Object。而如果某个类明确继承另一个，那么Object也一定是它的间接父类！
 *
 * 继承层次中的结论:
 *      1.在继承层次中,不管隔了几层,只有父类和子类,一条继承链中,上游类都是父类,下游类都是子类
 *          --> 下游类 "is-a" 所有上游类
 *      2.在一条继承链当中,下游类总是继承上游类的所有成员
 *      3.(重点)不在一条继承链中的两个类,没有任何关系.
 *
 * @since 09:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Son s = new Son();
        // 创建Son的对象,有几种引用接收的方式?
        Son s = new Son();
        Father fs = new Son();
        Grandfather gf = new Son();
        // Object是祖先类,是Java任何一个类型的父类,所以它可以指向任何一个对象(包含数组对象)
        Object o = new Son();
        Object o2 = "123";
        Object o3 = new int[3];
        System.out.println(s.gfVar);
        System.out.println("---------------------");
    }

    public void test() {
        Grandfather gf = new Grandfather();
        Father f = (Father) gf;
        Father2 f2 = (Father2) gf;

        Father2 f3 = new Father2();
        // 引用数据类型的类型转换,向上转型以及向下转型,都只能发生在同一条继承链中的两个类之间
        // Son s = (Son) f3;
    }
}

// Class 'Grandfather' explicitly extends 'java.lang.Object'
class Grandfather {
    int gfVar;
}

class Father extends Grandfather {
    int fVar;
}

class Father2 extends Grandfather {

}

class Son extends Father {
    int sVar;
}

class Grandson extends Son {

}
// Class cannot extend multiple classes
// class Son extends Father, Father2 {
// }
